package com.lvyq.myplayer.common.util

/**
 * 文件描述：DownloadUtils
 * 作者：lvyq
 * 创建时间：2025-05-23
 * 修改时间：2025-05-23
 */
import android.annotation.SuppressLint
import android.app.DownloadManager
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.database.ContentObserver
import android.database.Cursor
import android.net.Uri
import android.os.Build
import android.os.Environment
import android.os.Handler
import android.os.Looper
import android.util.Log
import androidx.core.content.FileProvider
import java.io.File

class DownloadUtils private constructor(context: Context) {

    companion object {
        private const val TAG = "DownloadUtils"
        private var instance: DownloadUtils? = null

        /**
         * 获取单例实例
         */
        fun getInstance(context: Context): DownloadUtils {
            return instance ?: synchronized(this) {
                instance ?: DownloadUtils(context.applicationContext).also { instance = it }
            }
        }
    }

    private val context: Context = context.applicationContext
    private val downloadManager: DownloadManager =
        context.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager
    private var downloadId: Long = -1
    private var progressListener: DownloadProgressListener? = null
    private var downloadObserver: DownloadObserver? = null

    /**
     * 下载文件
     *
     * @param url 文件下载地址
     * @param fileName 保存的文件名
     * @param listener 下载进度监听器
     */
    fun downloadFile(url: String, fileName: String, listener: DownloadProgressListener) {
        this.progressListener = listener

        // 创建下载请求
        val request = DownloadManager.Request(Uri.parse(url)).apply {
            setTitle("文件下载")
            setDescription("正在下载文件...")
            setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED)

            // 设置下载路径
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                // Android 10 及以上版本，使用应用专属目录
                setDestinationInExternalFilesDir(context, Environment.DIRECTORY_DOWNLOADS, fileName)
            } else {
                // Android 10 以下版本，使用公共下载目录
                setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName)
            }

            // 支持断点续传
            setAllowedOverMetered(true) // 允许使用移动网络
            setAllowedOverRoaming(true) // 允许漫游时下载
        }

        // 开始下载
        downloadId = downloadManager.enqueue(request)

        // 注册下载完成监听
        context.registerReceiver(downloadCompleteReceiver, IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE))

        // 注册下载进度监听
        if (progressListener != null) {
            downloadObserver = DownloadObserver(Handler(Looper.getMainLooper()), downloadId)
            context.contentResolver.registerContentObserver(
                Uri.parse("content://downloads/my_downloads"), true, downloadObserver!!
            )
        }
    }

    /**
     * 安装 APK 文件
     */
    private fun installApk(context: Context) {
        val apkFile = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            // Android 10 及以上版本，使用应用专属目录
            File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "app-update.apk")
        } else {
            // Android 10 以下版本，使用公共下载目录
            File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "app-update.apk")
        }

        if (!apkFile.exists()) {
            Log.e(TAG, "APK 文件不存在")
            return
        }

        // 使用 FileProvider 获取文件的 Uri
        val apkUri = FileProvider.getUriForFile(context, "${context.packageName}.fileprovider", apkFile)

        // 创建安装 Intent
        val installIntent = Intent(Intent.ACTION_VIEW).apply {
            setDataAndType(apkUri, "application/vnd.android.package-archive")
            addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
            addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)

            // 适配 Android 7.0 及以上版本
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
            }

            // 适配 Android 8.0 及以上版本，允许安装未知来源的应用
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                if (!context.packageManager.canRequestPackageInstalls()) {
                    // 跳转到设置页面，允许安装未知来源应用
                    val intent = Intent(android.provider.Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES).apply {
                        data = Uri.parse("package:${context.packageName}")
                        addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
                    }
                    context.startActivity(intent)
                    return
                }
            }
        }

        context.startActivity(installIntent)

        // 注销广播接收器和内容观察者
        context.unregisterReceiver(downloadCompleteReceiver)
        downloadObserver?.let {
            context.contentResolver.unregisterContentObserver(it)
        }
    }

    /**
     * 下载完成广播接收器
     */
    private val downloadCompleteReceiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context, intent: Intent) {
            val id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1)
            if (id == downloadId) {
                progressListener?.onDownloadComplete()
                installApk(context)
            }
        }
    }

    /**
     * 下载进度观察者
     */
    private inner class DownloadObserver(handler: Handler, private val downloadId: Long) : ContentObserver(handler) {
        override fun onChange(selfChange: Boolean) {
            super.onChange(selfChange)
            queryDownloadProgress()
        }

        @SuppressLint("Range")
        private fun queryDownloadProgress() {
            val query = DownloadManager.Query().apply {
                setFilterById(downloadId)
            }

            context.contentResolver.query(
                Uri.parse("content://downloads/my_downloads"),
                null,
                null,
                null,
                null
            )?.use { cursor ->
                if (cursor.moveToFirst()) {
                    val status = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS))
                    val bytesDownloaded = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR))
                    val bytesTotal = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES))

                    when (status) {
                        DownloadManager.STATUS_RUNNING -> {
                            if (bytesTotal > 0) {
                                val progress = ((bytesDownloaded * 100L) / bytesTotal).toInt()
                                progressListener?.onProgress(progress)
                            }
                        }
                        DownloadManager.STATUS_FAILED -> {
                            progressListener?.onError("下载失败")
                        }
                    }
                }
            }
        }
    }

    /**
     * 下载进度监听器
     */
    interface DownloadProgressListener {
        fun onProgress(progress: Int) // 下载进度（0-100）
        fun onError(message: String)  // 下载失败
        fun onDownloadComplete()      // 下载完成
    }
}
